package cn.buk.tms.dao;

import cn.buk.common.sc.CommonSearchCriteria;
import cn.buk.tms.dto.AuthInfo;
import cn.buk.tms.dto.FlightOrderPassengerDto;
import cn.buk.tms.dto.FlightOrderStatusStat;
import cn.buk.tms.entity.order.OrderAttachment;
import cn.buk.tms.entity.order.flight.*;
import cn.buk.tms.sc.SearchFlightOrderCriteria;
import cn.buk.tms.entity.misc.*;
import cn.buk.tms.flight.request.FlightOrderRequestDto;

import java.util.Date;
import java.util.List;

/**
 * @author yfdai
 */
public interface FlightOrderDao {

  /**
   * 保存一个新订单
   *
   * @return 保存成功与否的状态
   */
  int createOrder(FlightOrder o, String username);

  /**
   * 根据id获取订单详情
   *
   * @param id 订单id
   * @return 包含详情的订单对象
   */
  FlightOrder getOrderDetailById(int id);

  /**
   * 根据查询条件查找订单
   */
  List<FlightOrder> searchOrder(int enterpriseId, String username, SearchFlightOrderCriteria sc,
                                boolean isTicketer, List<Integer> allowedCustomerIds);

  /**
   * 查找自指定时间以来所有已完成的订单
   * @param sc 分页查询
   * @param beginDate 开始日期
   */
  List<FlightOrder> searchOrder(CommonSearchCriteria sc, Date beginDate);


  /**
   * 搜索指定日期以来的，待认领和已认领出票的订单
   *
   * @param enterpriseId 企业id
   * @param startDate    订单最早生成日期
   * @return 订单列表
   */
  List<FlightOrder> searchWaitingForAutoTicketOrder(final int enterpriseId, final Date startDate);

  List<FlightOrder> searchNeedDeliveryFlightOrders(int enterpriseId, SearchFlightOrderCriteria sc);

  /**
   * 查找没有大客户号的机票订单（主要是用于之前已经保存的订单的再处理）
   */
  List<FlightOrder> searchNoKeyCustomerNoOrders(int enterpriseId, int max);

  List<FlightOrder> searchUnpaidFlightOrders(int max);

  List<FlightOrder> searchUnImportedFlightOrders(int max);


  /**
   * 查找需要校验价格的机票订单
   */
  List<FlightOrder> searchNeedPriceCheckFlightOrders(int enterpriseId, Date startDate);

  /**
   * 查找需要分配审批人的机票订单
   */
  List<FlightOrder> searchNeedAssignApproverFlightOrders(final int enterpriseId);


  List<FlightOrder> searchMeetPolicyFlightOrders(int enterpriseId);

  List<FlightOrder> searchFlightOrderByStatus(int enterpriseId, int status, int max);

  List<FlightOrder> searchFlightOrdersNeedRefreshPnr(int enterpriseId, int max);

  /**
   * 查找需要更新票号DETR信息的订单
   */
  List<FlightOrder> searchFlightOrdersNeedRefreshDetr(int enterpriseId, int max);

  /**
   * 查找需要重新检查DETR内容的机票订单
   */
  List<FlightOrder> searchFlightOrdersNeedRecheckDetr(int enterpriseId, int max);

  /**
   * 查找DETR已更新的订单
   */
  List<FlightOrder> searchFlightOrdersDetrFinished(int enterpriseId, int max);


  /**
   * 查找需要就行业务规则校验的订单
   */
  List<FlightOrder> searchFlightOrdersNeedValidate(int enterpriseId);

  /**
   * 根据编码查找机票订单
   */
  List<FlightOrder> searchFlightOrdersByPnrNo(int enterpriseId, String pnrNo);

  List<FlightOrder> searchFlightOrdersNeedRecheckShowStatus(int enterpriseId, int max);

  /**
   * 根据机票订单的id, 查找该订单包含的航班信息
   */
  List<FlightOrderFlight> searchFlightOrderFlights(int flightOrderId);

  /**
   * 根据乘机人姓名信息查找机票订单的乘机人信息, 需要有手机号的订单
   */
  List<FlightOrderPassenger> searchFlightOrderPassengers(String name, int idType, String idNo);

  /**
   * 修改机票订单的价格
   *
   * @param enterpriseId 企业id
   * @param username     用户名
   * @param orderId      订单id
   * @param dto          价格对象
   * @return 返回1，表示修改成功
   */
  int updatePrice(int enterpriseId, String username, int orderId, FlightOrderRequestDto dto);

  /**
   * 修改机票订单中的乘机人信息
   *
   * @param authInfo 认证信息
   * @param psgDto   乘机人信息
   */
  int updatePassenger(AuthInfo authInfo, FlightOrderPassengerDto psgDto);

  /**
   * 修改机票订单的编码
   */
  int updatePnr(int enterpriseId, String username, int orderId, String pnrNo);

  /**
   * 更新机票订单保存的编码详情
   */
  void updatePnrDetail(int enterpriseId, String username, int orderId, String pnrDetail);

  /**
   * 取消机票订单
   */
  int cancelFlightOrder(int enterpriseId, String username, int orderId, int reasonCode,
                        String reasonDesc);

  /**
   * 提交订单，等待开票
   *
   * @param enterpriseId 企业id
   * @param username     用户名
   * @param orderId      订单id
   * @return 返回FLIGHT_ORDER_STATUS_WAIT_TICKETING，表示机票订单等待开票
   */
  int submitFlightOrder(int enterpriseId, String username, int orderId);

  /**
   * 审批通过 允许订单开票
   */
  int approveFlightOrder(int enterpriseId, String username, int orderId);

  List<OperationLog> searchHistory(int enterpriseId, int orderId);

  /**
   * 增加机票订单的日志
   */
  void appendFlightOrderLog(int enterpriseId, String username, int orderId, String remark);

  /**
   * 认领订单开票
   */
  int toTicketFlightOrder(int enterpriseId, String username, int orderId);

  /**
   * 取消认领
   */
  int cancelClaimFlightOrder(int enterpriseId, String username, int orderId);

  /**
   * 认领订单开票，并设置是否自动开票
   *
   * @param enterpriseId  企业id
   * @param username      用户名
   * @param orderId       订单id
   * @param autoTicketing 是否自动开票
   */
  int claimTicketingFlightOrder(int enterpriseId, String username, int orderId, int autoTicketing);

  int finishFlightOrder(int enterpriseId, String username, int orderId, Date etdzDate);

  int rollbackFlightOrderStatus(int enterpriseId, String username, int orderId, String remark);

  /**
   * 修改订单的供应商
   */
  int updateSupplier(int enterpriseId, String username, int orderId, Supplier supplier,
                     PaymentMethod pm);

  int updateSupplier(int enterpriseId, String username, int orderId, int supplierId);

  int updateTicketOptions(int enterpriseId, String username, int orderId, Supplier supplier,
                          PaymentMethod pm, int autoTicketing, int price);

  /**
   * 修改订单的支付方式
   */
  int updatePaymentMethod(int enterpriseId, String username, int orderId,
                          PaymentMethod paymentMethod);

  int updateDeliveryDate(int enterpriseId, String username, int orderId, Date deliveryDate);

  int updateTicketer(int enterpriseId, String username, int orderId, String ticketer);

  /**
   * 修改机票订单的票号
   */
  int updateTicketNo(int enterpriseId, String username, int orderId,
                     List<FlightOrderPassenger> passengers);

  int delFlightOrderExtra(int enterpriseId, String username, int orderId, int extraId);

  int createCancelRequest(int enterpriseId, String username, int orderId, int reasonCode,
                          String reasonDesc);

  /**
   * 同意 取消订单的请求
   */
  int agreeCancelRequest(int enterpriseId, String username, int orderId, int requestId);

  /**
   * 同意 取消订单的请求(目前用户反馈企业微信中的操作）
   */
  void agreeCancelRequest(int enterpriseId, String username, int requestId, String remark);

  /**
   * 拒绝 取消订单的请求
   */
  int denyCancelRequest(int enterpriseId, String username, int orderId, int requestId,
                        int reasonCode, String reasonDesc);

  /**
   * 拒绝 取消订单的请求(目前用户反馈企业微信中的操作）
   */
  void denyCancelRequest(int enterpriseId, String username, int requestId, String remark);


  int finishItineraryDelivery(int enterpriseId, String username, int orderId, String remark);


  void setFlightOrderWriteOff(int enterpriseId, String username, int orderId, String remark);


  int incFlightOrderPrintCount(int enterpriseId, String username, int orderId);


  int updateFlightOrderCustomer(int enterpriseId, String username, int orderId, int customerId,
                                String costCenter);


  int updateFlightOrderIntlTicket(int enterpriseId, String username, int orderId, int intlTicket);


  /**
   * 修改机票订单中保存的大客户号
   */
  int updateFlightOrderKeyCustomerNo(int enterpriseId, String username, int orderId, String keyCustomerNo);

  /**
   * 修改订单的自动出票状态
   */
  int updateFlightOrderAutoTicketing(int enterpriseId, String username, int orderId, int newStatus, String remark);

  /**
   * 修改订单的 账单导入状态为已导入
   */
  int updateFlightOrderBillImported(int enterpriseId, String username, int flightOrderId);

  FlightOrderStatusStat statFlightMiscOrderStatus(int enterpriseId);

  /**
   * 根据订单号获取订单详情
   *
   * @param enterpriseId 企业id
   * @param orderNo      订单号
   */
  FlightOrder getOrderDetailByOrderNo(int enterpriseId, String orderNo);



  /**
   * 把passengerId和vipLevel保存到机票订单的乘机人信息表中
   */
  void updateFlightOrderPassengerVipAndId(int id, int passengerId, int vipLevel);

  List<BlanketOrder> searchSubOrders(int enterpriseId, int blanketOrderId);

  BlanketOrder searchParentOrder(int enterpriseId, int blanketOrderId);


  /**
   * 保存订单的价格校验结果
   */
  int updateFlightOrderPriceChecked(int enterpriseId, int orderId, String username, int checkStatus, String remark);

  /**
   * 为机票订单指定审批人
   */
  int updateFlightOrderApprover(int enterpriseId, String username, int orderId, String approver);


  /**
   * 保存订单的符合差旅政策校验的结果
   */
  void updateFlightOrderViolationStatus(int enterpriseId, String username, int orderId, int status, String remark);


  /**
   * 保存机票订单的PNR更新失败状态
   */
  void updateFlightOrderRefreshPnrStatusFailed(int enterpriseId, String username, int orderId, String remark);

  /**
   * 修改机票订单的DETR状态
   *  @param enterpriseId 企业id
   * @param username     当前用户名
   * @param orderId      订单id
   * @param detrStatus   新的detr状态
   * @param remark       备注
   */
  void updateFlightOrderDetrStatus(int enterpriseId, String username, int orderId, int detrStatus, String remark);
  void updateFlightOrderDetrStatus2(int enterpriseId, String username, int orderId, int detrStatus, String remark);

  int confirmFlightOrderNotice(int enterpriseId, String username, int orderId);

  /**
   * 查找机票订单的票号
   */
  List<FlightOrderTicket> searchFlightOrderTickets(int enterpriseId, int orderId);

  void updateFlightOrderTicketStatus(int enterpriseId, String agentName, int orderId, List<FlightOrderTicket> tickets);


  void updateFlightOrderNotice(int enterpriseId, String username, int orderId, int noticeType, String noticeContent);


  void updateFlightOrderShowStatus(int enterpriseId, String username, int orderId, int showStatus);

  int saveFlightOrderAttachment(int enterpriseId, String username, int orderId, final int orderTyp, List<OrderAttachment> attachments);

  /**
   * 查找机票订单的附件
   *
   * @param enterpriseId 企业id
   * @param orderId      订单id
   * @return 附件列表
   */
  List<OrderAttachment> searchAttachments(int enterpriseId, int orderId);

  void updateFlightOrderNotifyStatus(int enterpriseId, String username, int id, String content);

  List<FlightOrderFlight> searchFlightOrderFlightsAirportNameIsNull(int enterpriseId);

  void updateFlightOrderFlightAirportName(int orderFlightId, int portType, String portName);

  int savePassengers(int enterpriseId, String username, int orderId, List<FlightOrderPassenger> passengers);

  /**
   * 保存外部订单号和编码
   */
  int updateExternalOrderNo(int enterpriseId, String username, int orderId, String externalOrderNo, String bigPnrNo, String remark);

  /**
   * 清空外部订单号和编码
   */
  int resetExternalOrderNo(int enterpriseId, String username, int orderId, String remark);

  /**
   * 更改机票订单的某一个属性
   */
  int updateFlightOrderProperty(int enterpriseId, String username, int orderId, String propertyName, String propertyValue);

  /**
   * 保存外部订单信息
   * @param enterpriseId 企业id
   * @param orderNo 机票订单号
   * @param supplierId 供应商id
   * @param externalOrderNo 外部订单号
   * @return id
   */
  int saveExternalOrder(int enterpriseId, String orderNo, int supplierId, String externalOrderNo);

  List<FlightOrderExternal> searchExternalFlightOrders(int enterpriseId, String username, int orderId);

  FlightOrderExternal getExternalOrder(int externalOrderId);

  int removeExternalOrder(int enterpriseId, String username, int externalOrderId, String remark);

  /**
   * 更新外部订单的信息
   * @param enterpriseId
   * @param username
   * @param externalOrderId
   * @param externalOrderInfo
   * @return
   */
  int updateExternalOrder(int enterpriseId, String username, int externalOrderId, FlightOrderExternal externalOrderInfo);
}